using System;
using System.Collections.Generic;
using UD.GRAL.Entity;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data.Common;
using System.Data;
using UD.Utilities.Exceptions;

namespace UD.GRAL.DataAccess
{
    public class MunicipioDAL : GeneralDAL
    {
        public MunicipioDAL()
        {
        }
        public int InsertarMunicipio(Municipio pMunicipio)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_Municipio_Insertar"))
                {
                    int vResultado;
                    vDataBase.AddOutParameter(vDbCommand, "@IdMunicipio", DbType.Int32, 18);
                    vDataBase.AddInParameter(vDbCommand, "@IdDepartamento", DbType.Int32, pMunicipio.IdDepartamento);
                    vDataBase.AddInParameter(vDbCommand, "@CodMunicipio", DbType.String, pMunicipio.CodMunicipio);
                    vDataBase.AddInParameter(vDbCommand, "@NombreMunicipio", DbType.String, pMunicipio.NombreMunicipio);
                    vDataBase.AddInParameter(vDbCommand, "@Estado", DbType.Boolean, pMunicipio.Estado);
                    vDataBase.AddInParameter(vDbCommand, "@UsuarioCrea", DbType.String, pMunicipio.UsuarioCrea);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    pMunicipio.IdMunicipio = Convert.ToInt32(vDataBase.GetParameterValue(vDbCommand, "@IdMunicipio").ToString());
                    GenerarLogAuditoria(pMunicipio, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }
        public int ModificarMunicipio(Municipio pMunicipio)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_Municipio_Modificar"))
                {
                    int vResultado;
                    vDataBase.AddInParameter(vDbCommand, "@IdMunicipio", DbType.Int32, pMunicipio.IdMunicipio);
                    vDataBase.AddInParameter(vDbCommand, "@IdDepartamento", DbType.Int32, pMunicipio.IdDepartamento);
                    vDataBase.AddInParameter(vDbCommand, "@CodMunicipio", DbType.String, pMunicipio.CodMunicipio);
                    vDataBase.AddInParameter(vDbCommand, "@NombreMunicipio", DbType.String, pMunicipio.NombreMunicipio);
                    vDataBase.AddInParameter(vDbCommand, "@Estado", DbType.Boolean, pMunicipio.Estado);
                    vDataBase.AddInParameter(vDbCommand, "@UsuarioModifica", DbType.String, pMunicipio.UsuarioModifica);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    GenerarLogAuditoria(pMunicipio, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }
        public int EliminarMunicipio(Municipio pMunicipio)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_Municipio_Eliminar"))
                {
                    int vResultado;
                    vDataBase.AddInParameter(vDbCommand, "@IdMunicipio", DbType.Int32, pMunicipio.IdMunicipio);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    GenerarLogAuditoria(pMunicipio, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }


        public Municipio ConsultarMunicipio(int pIdMunicipio)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_Municipio_Consultar"))
                {
                    vDataBase.AddInParameter(vDbCommand, "@IdMunicipio", DbType.Int32, pIdMunicipio);
                    using (IDataReader vDataReaderResults = vDataBase.ExecuteReader(vDbCommand))
                    {
                        Municipio vMunicipio = new Municipio();
                        while (vDataReaderResults.Read())
                        {
                            vMunicipio.IdMunicipio = vDataReaderResults["IdMunicipio"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdMunicipio"].ToString()) : vMunicipio.IdMunicipio;
                            vMunicipio.IdDepartamento = vDataReaderResults["IdDepartamento"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdDepartamento"].ToString()) : vMunicipio.IdDepartamento;
                            vMunicipio.CodMunicipio = vDataReaderResults["CodMunicipio"] != DBNull.Value ? Convert.ToString(vDataReaderResults["CodMunicipio"].ToString()) : vMunicipio.CodMunicipio;
                            vMunicipio.NombreMunicipio = vDataReaderResults["NombreMunicipio"] != DBNull.Value ? Convert.ToString(vDataReaderResults["NombreMunicipio"].ToString()) : vMunicipio.NombreMunicipio;
                            vMunicipio.Estado = vDataReaderResults["Estado"] != DBNull.Value ? Convert.ToBoolean(vDataReaderResults["Estado"].ToString()) : vMunicipio.Estado;
                            vMunicipio.UsuarioCrea = vDataReaderResults["UsuarioCrea"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioCrea"].ToString()) : vMunicipio.UsuarioCrea;
                            vMunicipio.FechaCrea = vDataReaderResults["FechaCrea"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaCrea"].ToString()) : vMunicipio.FechaCrea;
                            vMunicipio.UsuarioModifica = vDataReaderResults["UsuarioModifica"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioModifica"].ToString()) : vMunicipio.UsuarioModifica;
                            vMunicipio.FechaModifica = vDataReaderResults["FechaModifica"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaModifica"].ToString()) : vMunicipio.FechaModifica;
                        }
                        return vMunicipio;
                    }
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new GenericException(ex);
            }
        }

        public List<Municipio> ConsultarMunicipios(String pCodMunicipio, String pNombreMunicipio, Boolean? pEstado)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_Municipios_Consultar"))
                {
                    if(pCodMunicipio != null)
                         vDataBase.AddInParameter(vDbCommand, "@CodMunicipio", DbType.String, pCodMunicipio);
                    if(pNombreMunicipio != null)
                         vDataBase.AddInParameter(vDbCommand, "@NombreMunicipio", DbType.String, pNombreMunicipio);
                    if(pEstado != null)
                         vDataBase.AddInParameter(vDbCommand, "@Estado", DbType.Boolean, pEstado);
                    using (IDataReader vDataReaderResults = vDataBase.ExecuteReader(vDbCommand))
                    {
                        List<Municipio> vListaMunicipio = new List<Municipio>();
                        while (vDataReaderResults.Read())
                        {
                                Municipio vMunicipio = new Municipio();
                            vMunicipio.IdMunicipio = vDataReaderResults["IdMunicipio"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdMunicipio"].ToString()) : vMunicipio.IdMunicipio;
                            vMunicipio.IdDepartamento = vDataReaderResults["IdDepartamento"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdDepartamento"].ToString()) : vMunicipio.IdDepartamento;
                            vMunicipio.CodMunicipio = vDataReaderResults["CodMunicipio"] != DBNull.Value ? Convert.ToString(vDataReaderResults["CodMunicipio"].ToString()) : vMunicipio.CodMunicipio;
                            vMunicipio.NombreMunicipio = vDataReaderResults["NombreMunicipio"] != DBNull.Value ? Convert.ToString(vDataReaderResults["NombreMunicipio"].ToString()) : vMunicipio.NombreMunicipio;
                            vMunicipio.Estado = vDataReaderResults["Estado"] != DBNull.Value ? Convert.ToBoolean(vDataReaderResults["Estado"].ToString()) : vMunicipio.Estado;
                            vMunicipio.UsuarioCrea = vDataReaderResults["UsuarioCrea"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioCrea"].ToString()) : vMunicipio.UsuarioCrea;
                            vMunicipio.FechaCrea = vDataReaderResults["FechaCrea"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaCrea"].ToString()) : vMunicipio.FechaCrea;
                            vMunicipio.UsuarioModifica = vDataReaderResults["UsuarioModifica"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioModifica"].ToString()) : vMunicipio.UsuarioModifica;
                            vMunicipio.FechaModifica = vDataReaderResults["FechaModifica"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaModifica"].ToString()) : vMunicipio.FechaModifica;
                                vListaMunicipio.Add(vMunicipio);
                        }
                        return vListaMunicipio;
                    }
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new GenericException(ex);
            }
        }
    }
}
